import { StockNodeGateway } from "./dto.node";
import { StockNode, StockNodeLink } from "./schema.node";
import { CommonStock } from "./schema.notch";
import { PutDto, PutRes } from "~/rest";
import { TonOrderGroup } from "@/river-ton/schema.order";

export const RiverStockRpcGetNodeTreePath = `${StockNodeGateway.path}/getNodeTree`;
export type getStockNodeRpcDto = { tonOrderGroupId: TonOrderGroup["id"] };

export const RiverStockRpcPutRootPath = `${StockNodeGateway.path}/node/putRootSync`;
export type putStockNodeRootRpcDto = PutDto<StockNode> & { groupId: TonOrderGroup["id"] };

export const RiverStockRpcCopyPath = `${StockNodeGateway.path}/link/copy`;
export type copyStockNodeLinkRpcDto = { linkId: StockNodeLink["id"]; toTonOrderGroupId: TonOrderGroup["id"] };

export const RiverStockRpcGetNotchByIVIDPath = `${StockNodeGateway.path}/getNotchByIVID`;
export type getNotchByIVIDRpcDto = { tonOrderGroupIDs: TonOrderGroup["id"][]; ivids: CommonStock["ivid"][] };

export const RiverStockRpcGetOrderGroupRootNodePath = `${StockNodeGateway.path}/getOrderGroupRootNode`;
export type getOrderGroupRootNodeRpcDto = { tonOrderGroupId: TonOrderGroup["id"] };

export const RiverStockRpcGetRootNodeUpperOrderGroupPath = `${StockNodeGateway.path}/getRootNodeUpperOrderGroup`;
export type getRootNodeUpperOrderGroupRpcDto = { nodeLs: StockNode[] };

export interface RiverStockNodeRpcInterface<T> {
  // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░░░░▄▄▄▄▄▄░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░░▄█▀▀▀▀▀█▄░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░▄█░░▄▄▄░░█▄░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░█░░█▄▄█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░▀▄▀▄▄▄▄▄▀▄▀░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  Read（Notch）

  /** 根据商品模板（ivid）查询出（常规）库存对象 */
  getNotchByIVID(dto: T & getNotchByIVIDRpcDto): Promise<{ list: CommonStock[] }>;

  // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░░░░▄▄▄▄▄▄░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░░▄█▀▀▀▀▀█▄░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░▄█░░▄▄▄░░█▄░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░█░░█▄▄█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░▀▄▀▄▄▄▄▄▀▄▀░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  Read（Node）

  /** 这个订单集合，影响到了哪些库存根节点？ */
  getOrderGroupRootNode(dto: T & getOrderGroupRootNodeRpcDto): Promise<{ rootStockNodeLs: StockNode[] }>;

  /** 这些库存根节点，会被哪几个订单集合，影响库存 */
  getRootNodeUpperOrderGroup(dto: T & getRootNodeUpperOrderGroupRpcDto): Promise<{ groupIDs: TonOrderGroup["id"][] }>;

  /** 查询订单集合相关的节点信息，并按照层级返回节点（务必保证 tonOrderGroupId 和访客主账号一致）*/
  getNodeTree(dto: T & getStockNodeRpcDto): Promise<StockNode[][]>;

  // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░░░░▄▄▄▄▄▄░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░░▄█▀▀▀▀▀█▄░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░▄█░░▄▄▄░░█▄░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░█░░█▄▄█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░▀▄▀▄▄▄▄▄▀▄▀░░░░░░░░░░░░░░░░░░░░░░░░░░
  // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  Create

  /** 转换（订单集合 && 库存节点）的关联（务必保证 groupId 和访客主账号一致）*/
  copy(dto: T & copyStockNodeLinkRpcDto): Promise<null>;

  /** 创建根节点（务必保证 groupId 和访客主账号一致）*/
  putRootSync(dto: T & putStockNodeRootRpcDto): Promise<PutRes<StockNode>>;
}
